跳到主要内容

问:powershell -file 和 -c 参数有什么区别,为什么 -c 参数也可以执行 ps1 脚本?

是的,你说得对!-Command(或 -c确实也可以执行 .ps1 脚本文件,但它的行为和 -File 是有差别的。


✅ 举个例子先:

powershell -Command "C:\scripts\test.ps1"

这确实能执行 test.ps1,但它是以“命令”的方式执行脚本路径,而不是像 -File 那样作为“主脚本”来执行。


🧠 差异在哪?关键在这几点:

特性-File-Command
是否明确执行脚本文件✅ 是,专门设计来执行 .ps1❌ 否,是把路径当作一个命令来解释
是否支持 $args[] 参数✅ 是,自动把后续参数当作 $args[]❌ 不行,需要你手动解析参数
脚本行为一致性✅ 更标准、可靠⚠️ 有时会因为当前目录或作用域出问题
支持多语句表达式❌ 通常仅限脚本内容✅ 可执行多条命令、内联脚本等

📌 举例对比更清晰

假设你有一个脚本 C:\scripts\hello.ps1

Write-Host "Hello from script"
Write-Host "Param1: $args[0]"

-File 正常传参:

powershell -File "C:\scripts\hello.ps1" world

✅ 输出:

Hello from script
Param1: world

-Command 试试:

powershell -Command "C:\scripts\hello.ps1 world"

⛔ 错误(或脚本不执行,或 world 被当作参数给 PowerShell 本身) 你得改写为:

powershell -Command "& 'C:\scripts\hello.ps1' 'world'"

这样才行。注意那个 &(call operator),是 PowerShell 的执行脚本或函数符号。


🚩 所以总结一句话:

  • 可以用 -Command 执行脚本,但它是“间接”调用,需要你处理执行方式和参数传递
  • -File 是标准做法,尤其是传参、部署时更稳定

如果你在做 payload、自动化或远程执行,推荐优先用 -Command; 如果你在执行已有的脚本文件,优先用 -File